package com.wyg.lambda.example;

/**
 *
 * 实例3：Lambda表达式错误讲解，注意接口中唯一抽象方法返回值及类型。
 *
 * 弄清楚抽象接口的返回值，与方法体实现中语句返回值的区别，及对Lambda表达式的影响；
 *
 * Lambda表达式中 -》抽象接口：
 * 1.有返回值时，方法体中必须要有对应的返回值类型。否则Lambda表达式报错。
 * 2.没有返回值时，方法体中不用强行指定返回值类型。可以调用带返回值的方法，但是默认不会使用其返回的结果值，所以不对Lambda表达式造成影响。
 *
 * @ClassName: Example_3_Error
 * @Description: TODO
 * @Auther: WangYG
 * @Date: 2020-02-20 01:57:11
 * @Version: 1.0
 */
public class Example_3_Error {

    public static void main(String[] args) {
        //考虑1：r1 = exec()正常，因为exec()没有返回值。
        // r2为什么可以执行get()方法而不报错，get()方法有返回值！
        Runnable r1 = () -> exec();
        Runnable r2 = () -> get();


        //考虑2：r3,r4为什么会报错！
        //Runnable r3 = () -> 100;
        //Runnable r4 = () -> "abc";

        //考虑3：f1 = () -> get(); 是OK的
        Foo f1 = () -> get();
        //考虑4：f2 = () -> exec(); 为什么会报错？
        //Foo f2 = () -> exec();


        //考虑5：f3 = () -> 100; 是OK的
        Foo f3 = () -> 100;
        //考虑6：f4 = () -> "200"; 为什么会报错？
        //Foo f4 = () -> "200";

    }

    public static void mainAnswer(){
        //考虑1 - Runnable r1 run方法没有返回值，在run中执行exec()和get()方法后并未使用返回值，所以不报错。
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                get();
                exec();
            }
        };

        //考虑2 - Runnable r1 run方法没有返回值，在run()方法中
        //      1.强行执行return返回值会报错，
        //      2.返回值类型与接口类中抽象方法返回值不一致时，也会报错。
        Runnable r2 = new Runnable() {
            @Override
            public void run() {
                //return 1;
                //return "abc";
            }
        };

        //考虑3 - Foo f1中 getA()方法有返回值，在getA中执行get()方法后自动返回结果(返回值一致)，所以不报错。
        //考虑4 - Foo f1中 getA()方法有返回值，在getA中执行exec()方法后没有返回值返回，所以会提示报错。
        Foo f1 = new Foo() {
            @Override
            public int getA() {
                //return exec();
                return get();
            }
        };

        //考虑5 - Foo f2中 getA()方法有返回值，在getA中执行return 111与方法返回值一致，所以不报错。
        //考虑6 - Foo f2中 getA()方法有返回值，在getA中执行return "222" 与方法返回值不一致，所以会提示报错。
        Foo f2 = new Foo() {
            @Override
            public int getA() {
                return 111;
                //return "222";
            }
        };

    }


    /**
     * 有返回值的get()方法
     * @return
     */
    public static int get(){
        return 1;
    }

    /**
     * 无返回值的exec()方法
     * @return:
     * @auther: WangYG
     * @date: 2020-02-20 02:13:54
     */
    public static void exec(){

    }

    /**
     * Foo函数式接口，唯一抽象方法get(),注意【有返回值】！！！
     */
    interface Foo{

        int getA();
    }

}
